package _func

import (
	"fmt"
	"reflect"
)

func StructsToMap(objects interface{}) ([]map[string]interface{}, error) {
	// 确保传入的是切片
	v := reflect.ValueOf(objects)
	if v.Kind() != reflect.Slice {
		return nil, fmt.Errorf("input must be a slice")
	}

	var result []map[string]interface{}

	// 遍历切片中的每个元素
	for i := 0; i < v.Len(); i++ {
		elem := v.Index(i) // 直接获取切片中的元素
		if elem.Kind() != reflect.Struct {
			return nil, fmt.Errorf("slice elements must be structs")
		}

		// 创建一个map来存储当前元素的字段
		m := make(map[string]interface{})

		// 遍历结构体的所有字段
		for j := 0; j < elem.NumField(); j++ {
			field := elem.Field(j)
			// 忽略未导出的字段
			if !field.CanInterface() {
				continue
			}

			// 获取字段名（如果需要，可以处理JSON标签）
			fieldName := elem.Type().Field(j).Name
			// 将字段名和值添加到map中
			m[fieldName] = field.Interface()
		}
		// 将map添加到结果切片中
		result = append(result, m)
	}

	return result, nil
}
